GoLandasIDEDevCloudasgo run/go build/dlv debugenvironment
前言
缘起一个
EOF错误,由于网络策略原因,本地开发机无法连接某个内网服务,遂转向在办公网内的远程服务器。本人作为 Linux 小菜,由此产生了一个新诉求:在 Windows 上远程开发和调试服务器的代码,充分地发挥 IDE 的强大作用。
环境准备
本地环境
- GoLand 2020.2.3
远程环境
- Go 1.16.6
- Delve 1.7.0
配置 GoLand 连接 DevCloud
创建 Deployment 配置
Tools->Deployment->Configuration->+

Connection - 网络连接
Type:选择SFTP协议SSH configuration:填写Host/Port/User name/Password信息,通过Test Connection验证Root path:点击Autodetect按钮Web server URL:暂时不用考虑

Mappings - 存储映射
Local path:本地开发机项目目录
Deployment path:远程服务器项目目录
Web path:暂时不用考虑

创建 Run/Debug 配置
Run->Edit Configurations->+->Go Remote

Host:远程服务器地址
Port:Delve Port

登录、查看和同步
登录远程服务器
Tool->Start SSH Session

查看远程目录树
Tools->Deployment->Browse Remote Host

同步本地文件夹
手动:
Tools->Deployment->Sync with Deployed to DevCloud自动:
Tools->Deployment->Automatic Upload (on explicit save)

部署与调试
远程执行部署脚本
编译调试一起
1 | dlv debug cmd/server/main.go --headless --listen=:2345 --api-version=2 |
先编译再调试
1 | go build -o cmd/server/demo.exe cmd/server/main.go |
进程后台操作
1 | nohup dlv debug cmd/server/main.go --headless --listen=:2345 --api-version=2 >> ./demo.log 2>&1 & # 后台启动 |
完整脚本文件
start.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14#!/bin/bash
# set go env
export GO111MODULE=auto
export GOPROXY=https://goproxy.io,direct
go mod tidy
go mod vendor
# kill processes already started
pkill -9 dlv
# run demo backgroud server
nohup dlv debug cmd/server/main.go --headless --listen=:2345 --api-version=2 >> ./demo.log 2>&1 &
echo 'nohup dlv debug cmd/server/main.go --headless --listen=:2345 --api-version=2 >> ./demo.log 2>&1 &'stop.sh
1
2
3
4#!/bin/bash
# kill processes already started
pkill -9 dlv
本地打开调试模式

PS:这里需要注意,
go run的时候返回数据到Postman,dlv debug的时候返回数据到GoLand
具体流程
- 配置好
Deployment和Run/Debug - 修改本地代码文件,手动或自动同步内容到远程
- 登录远程服务器,一键执行部署脚本
- 本地打好断点,开启调试模式
附录
GoLand Debug
- 开启调试模式:
Shift + F9 - 打下断点:点击 Code 左侧
- 查看变量:查看 Debug 面板
Step Over:F8Step Into:F7Step Out:Shift + F8- 下一个断点处:
F9
Delve Debug
- 开启调试模式:
dlv debug main.go - 打下断点:
break pkg.fn或break file:line - 查看变量:
print var或args或locals Step Over:nextStep Into:stepStep Out:stepout- 下一个断点处:
continue